首页>代码>Java Swing打猎射击游戏编程代码下载>/Java Swing打猎射击游戏/src/MainFrame.java
import static java.lang.Math.random;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MainFrame extends JFrame {
	private static long score = 0;// 分数
	private static Integer ammoNum = 5;// 子弹数量
	private static JLabel scoreLabel;// 分数
	private BackgroundPanel backgroundPanel;
	private static JLabel ammoLabel;
	private static JPanel infoPane;

	/**
	 * 构造方法
	 */
	public MainFrame() {
		super();
		setResizable(false);// 进制调整窗体大小
		setTitle("打猎游戏");
		infoPane = (JPanel) getGlassPane();// 获取玻璃面板
		JLabel label = new JLabel("装载子弹……");// 创建提示标签组件
		label.setHorizontalAlignment(SwingConstants.CENTER);
		label.setFont(new Font("楷体", Font.BOLD, 32));
		label.setForeground(Color.RED);
		infoPane.setLayout(new BorderLayout());
		infoPane.add(label);// 添加提示标签组件到玻璃面板

		setAlwaysOnTop(true);// 是窗体保持在最顶层
		setBounds(100, 100, 573, 411);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		backgroundPanel = new BackgroundPanel();// 创建带背景的面板
		backgroundPanel.setImage(new ImageIcon(getClass().getResource(
				"background.jpg")).getImage());// 设置背景图片
		getContentPane().add(backgroundPanel, BorderLayout.CENTER);
		// 添加鼠标事件适配器
		addMouseListener(new FrameMouseListener());
		scoreLabel = new JLabel();// 显示分数的标签组件
		scoreLabel.setHorizontalAlignment(SwingConstants.CENTER);
		scoreLabel.setForeground(Color.ORANGE);
		scoreLabel.setText("分数:");
		scoreLabel.setBounds(25, 15, 120, 18);
		backgroundPanel.add(scoreLabel);
		ammoLabel = new JLabel();// 显示自动数量的标签组件
		ammoLabel.setForeground(Color.ORANGE);
		ammoLabel.setHorizontalAlignment(SwingConstants.RIGHT);
		ammoLabel.setText("子弹数量:" + ammoNum);
		ammoLabel.setBounds(422, 15, 93, 18);
		backgroundPanel.add(ammoLabel);
	}

	/**
	 * 加分方法
	 */
	public synchronized static void appScore(int num) {
		score += num;
		scoreLabel.setText("分数:" + score);
	}

	/**
	 * 消耗子弹的方法
	 */
	public synchronized static void useAmmo() {
		synchronized (ammoNum) {
			ammoNum--;// 子弹数量递减
			ammoLabel.setText("子弹数量:" + ammoNum);
			if (ammoNum <= 0) {// 判断子弹是否小于0
				new Thread(new Runnable() {
					public void run() {
						// 显示提示信息面板
						infoPane.setVisible(true);
						try {
							// 1秒钟装载子弹的时间
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						ammoNum = 5;// 恢复子弹数量
						// 修改子弹数量标签的文本
						ammoLabel.setText("子弹数量:" + ammoNum);
						infoPane.setVisible(false);// 隐藏提示信息面板
					}
				}).start();
			}
		}
	}

	/**
	 * 判断子弹是否够用
	 * 
	 */
	public synchronized static boolean readyAmmo() {
		synchronized (ammoNum) {
			return ammoNum > 0;
		}
	}

	public static void main(String args[]) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainFrame frame = new MainFrame();
					frame.setVisible(true);
					frame.start();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * 启动游戏的方法
	 */
	public void start() {
		new PigThread().start();
		new BirdThread().start();
	}

	/**
	 * 窗体的鼠标事件监听器
	 * 
	 */
	private final class FrameMouseListener extends MouseAdapter {
		public void mousePressed(final MouseEvent e) {
			Component at = backgroundPanel.getComponentAt(e.getPoint());
			if (at instanceof BackgroundPanel) {// 如果点到面板也扣除子弹
				MainFrame.useAmmo();// 消耗子弹
			}
			/*
			 * if (at instanceof BirdLabel) {// 如果点到小鸟 MainFrame.appScore(32);//
			 * 加分 } if (at instanceof PigLabel) {// 如果点到野猪
			 * MainFrame.appScore(11);// 加分 }
			 */
		}
	}

	/**
	 * 生成猪角色的线程
	 * 
	 */
	class PigThread extends Thread {
		@Override
		public void run() {
			while (true) {
				// 创建代表野猪的标签控件
				PigLabel pig = new PigLabel();
				pig.setSize(120, 80);// 设置控件初始大小
				backgroundPanel.add(pig);// 添加控件到背景面板
				try {
					// 线程随机休眠一段时间
					sleep((long) (random() * 3000) + 500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 生成鸟角色的线程
	 * 
	 */
	class BirdThread extends Thread {
		@Override
		public void run() {
			while (true) {
				// 创建代表小鸟的标签控件
				BirdLabel bird = new BirdLabel();
				bird.setSize(50, 50);// 设置控件初始大小
				backgroundPanel.add(bird);// 添加控件到背景面板
				try {
					// 线程随机休眠一段时间
					sleep((long) (Math.random() * 3000) + 500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
最近下载更多
wxm123  LV1 2022年5月20日
2508268826  LV1 2022年1月5日
oneonev  LV1 2021年12月27日
qqqdaren  LV1 2021年12月23日
我是我  LV1 2021年12月21日
lhxcool  LV1 2021年12月3日
刹那芳华  LV1 2021年5月17日
ldx1234  LV4 2021年5月17日
waitingforyou  LV20 2021年4月21日
toyaWDS  LV1 2021年3月18日
最近浏览更多
迷迭香  LV10 2022年9月21日
wxm123  LV1 2022年5月20日
jdsugdys  LV1 2022年5月18日
linlin11 2022年5月2日
暂无贡献等级
.  LV2 2022年4月23日
unknown_turtleshell  LV3 2022年4月16日
kingoneyang  LV13 2022年4月11日
wwwweey 2022年2月14日
暂无贡献等级
2508268826  LV1 2022年1月5日
oneonev  LV1 2021年12月27日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友